/*
 * @Author: 0x9DEFA478
 * @Date: 2021-07-27 23:01:22
 * @LastEditTime: 2022-01-07 00:09:33
 * @LastEditors: 0x9DEFA478
 * @Description: 
 * QQ:2652450237
 * ============================================================================================================================================
 * 
 * 
 * 
 *                                                                                               ************      ****************************
 *                                                                                             ************      ****************************  
 *                                                                                           ************      ****************************    
 *                                                                                         ************      ****************************      
 *                                                                                       ************      ************                        
 *                                                                                     ************      ************                          
 *                                                                                   ************      ************                            
 *                                                                                 ************      ************                              
 *                                                                               ************      ************                                
 *                                                                             ************      ************                                  
 *                                                                           ************      ************                                    
 *                                                                         ************      ************                                      
 *                                                                       ************      ************                                        
 *                                                                     ************      ************                                          
 *                                                                   ************      ************                                            
 *                                                                 ************      ************                                              
 *                                                               ************      ************                                                
 *                                                             ************      ************                                                  
 *                                                           ************      ************                                                    
 *                                                         ************      ************                                                      
 *                                                       ************      ************                                                        
 *                                                     ************      ************                                                          
 *                                                   ************      ************                                                            
 *                                                 ************      ************                                                              
 *                                               ************      ************                                                                
 *                                             ************      ************                                                                  
 *                                           ************      ************                                                                    
 *                                         ************      ************                                                                      
 *                                       ************      ************                                                                        
 *                                     ************      ************                                                                          
 *                                   ************      ************                                                                            
 *                                 ************      ************                                                                              
 *                               ************      ************                                                                                
 *                             ************      ************                                                                                  
 *                           ************      ************                                                                                    
 *                         ************      ************                                                                                      
 *       ****************************      ************                                                                                        
 *     ****************************      ************                                                                                          
 *   ****************************      ************                                                                                            
 * ****************************      ************                                                                                              
 * 
 * 
 * 
 * ============================================================================================================================================
 * 
 */
#include "Peripheral.h"


static void Bootloader(void);
static void quadspi_init(void);
static void quadspi_SetMemoryMapped(void);



/**
 * @brief 系统预初始化 初始化Qspi 片外RAM等 在SystemInit中调用
 * @return 无
 */
void BspPreInit(){


  //跳转条件判断 如果满足跳转条件 下面的代码就不会执行
  Bootloader();


	SCB->VTOR=0x00000000U;//设置中断向量表
	
  //Qspi
  quadspi_init();
  quadspi_SetMemoryMapped();
  __DSB();
  __ISB();
}


static void Bootloader(){
  //不做跳转
}








//================================================================================================================================================================
//
//        quadspi
//
//================================================================================================================================================================

#define quadspi_BK1CS_GPIOx			GPIOB
#define quadspi_BK1CS_PinNum		6



#define quadspi_SCK_GPIOx				GPIOB
#define quadspi_SCK_PinNum			2

#define quadspi_BK1IO0_GPIOx		GPIOC
#define quadspi_BK1IO0_PinNum		9

#define quadspi_BK1IO1_GPIOx		GPIOC
#define quadspi_BK1IO1_PinNum		10

//#define quadspi_BK1IO2_GPIOx		GPIOE
//#define quadspi_BK1IO2_PinNum		2

//#define quadspi_BK1IO3_GPIOx		GPIOD
//#define quadspi_BK1IO3_PinNum		13


//#define BK2CS_quadspi_GPIOx			
//#define BK2CS_quadspi_PinNum		

//#define quadspi_BK2IO0_GPIOx		GPIOH
//#define quadspi_BK2IO0_PinNum		2

//#define quadspi_BK2IO1_GPIOx		GPIOH
//#define quadspi_BK2IO1_PinNum		3

//#define quadspi_BK2IO2_GPIOx		GPIOG
//#define quadspi_BK2IO2_PinNum		9

//#define quadspi_BK2IO3_GPIOx		GPIOG
//#define quadspi_BK2IO3_PinNum		14

/**
 * @brief quadspi初始化
 * @return 无
 */
static void quadspi_init(){

  RCC->AHB3ENR|=RCC_AHB3ENR_QSPIEN;
  RCC->AHB1ENR|=(RCC_AHB1ENR_GPIOBEN|RCC_AHB1ENR_GPIOCEN);

  oIP_GPIO_Config(quadspi_SCK_GPIOx,    quadspi_SCK_PinNum,   vIP_GPIO_Mode_AF,vIP_GPIO_OutType_PP,vIP_GPIO_Speed_VERYHIGH,vIP_GPIO_PuPd_NP);

  oIP_GPIO_Config(quadspi_BK1CS_GPIOx,	quadspi_BK1CS_PinNum ,vIP_GPIO_Mode_AF,vIP_GPIO_OutType_PP,vIP_GPIO_Speed_VERYHIGH,vIP_GPIO_PuPd_NP);
  oIP_GPIO_Config(quadspi_BK1IO0_GPIOx,	quadspi_BK1IO0_PinNum,vIP_GPIO_Mode_AF,vIP_GPIO_OutType_PP,vIP_GPIO_Speed_VERYHIGH,vIP_GPIO_PuPd_NP);
  oIP_GPIO_Config(quadspi_BK1IO1_GPIOx,	quadspi_BK1IO1_PinNum,vIP_GPIO_Mode_AF,vIP_GPIO_OutType_PP,vIP_GPIO_Speed_VERYHIGH,vIP_GPIO_PuPd_NP);
  // oIP_GPIO_Config(quadspi_BK1IO2_GPIOx,	quadspi_BK1IO2_PinNum,vIP_GPIO_Mode_AF,vIP_GPIO_OutType_PP,vIP_GPIO_Speed_VERYHIGH,vIP_GPIO_PuPd_NP);
  // oIP_GPIO_Config(quadspi_BK1IO3_GPIOx,	quadspi_BK1IO3_PinNum,vIP_GPIO_Mode_AF,vIP_GPIO_OutType_PP,vIP_GPIO_Speed_VERYHIGH,vIP_GPIO_PuPd_NP);

  // oIP_GPIO_Config(quadspi_BK2IO0_GPIOx,	quadspi_BK2IO0_PinNum,vIP_GPIO_Mode_AF,vIP_GPIO_OutType_PP,vIP_GPIO_Speed_VERYHIGH,vIP_GPIO_PuPd_NP);
  // oIP_GPIO_Config(quadspi_BK2IO1_GPIOx,	quadspi_BK2IO1_PinNum,vIP_GPIO_Mode_AF,vIP_GPIO_OutType_PP,vIP_GPIO_Speed_VERYHIGH,vIP_GPIO_PuPd_NP);
  // oIP_GPIO_Config(quadspi_BK2IO2_GPIOx,	quadspi_BK2IO2_PinNum,vIP_GPIO_Mode_AF,vIP_GPIO_OutType_PP,vIP_GPIO_Speed_VERYHIGH,vIP_GPIO_PuPd_NP);
  // oIP_GPIO_Config(quadspi_BK2IO3_GPIOx,	quadspi_BK2IO3_PinNum,vIP_GPIO_Mode_AF,vIP_GPIO_OutType_PP,vIP_GPIO_Speed_VERYHIGH,vIP_GPIO_PuPd_NP);


  oIP_GPIO_SetAF(quadspi_SCK_GPIOx,		quadspi_SCK_PinNum,	 9U);

  oIP_GPIO_SetAF(quadspi_BK1CS_GPIOx,	quadspi_BK1CS_PinNum,10U);
  oIP_GPIO_SetAF(quadspi_BK1IO0_GPIOx,quadspi_BK1IO0_PinNum,9U);
  oIP_GPIO_SetAF(quadspi_BK1IO1_GPIOx,quadspi_BK1IO1_PinNum,9U);
  // oIP_GPIO_SetAF(quadspi_BK1IO2_GPIOx,quadspi_BK1IO2_PinNum,9U);
  // oIP_GPIO_SetAF(quadspi_BK1IO3_GPIOx,quadspi_BK1IO3_PinNum,9U);

  // oIP_GPIO_SetAF(quadspi_BK2IO0_GPIOx,quadspi_BK2IO0_PinNum,9U);
  // oIP_GPIO_SetAF(quadspi_BK2IO1_GPIOx,quadspi_BK2IO1_PinNum,9U);
  // oIP_GPIO_SetAF(quadspi_BK2IO2_GPIOx,quadspi_BK2IO2_PinNum,9U);
  // oIP_GPIO_SetAF(quadspi_BK2IO3_GPIOx,quadspi_BK2IO3_PinNum,9U);



  QUADSPI->CR=0U;

  QUADSPI->CR|=((2U-1U)<<QUADSPI_CR_PRESCALER_Pos)    //设置分频 2分频
    |((4U-1U)<<QUADSPI_CR_FTHRES_Pos)                 //设置FIFO阈值为4
    |(0x0U<<QUADSPI_CR_FSEL_Pos)                      //设置bank bank(x+1)
    |(0x0U<<QUADSPI_CR_DFM_Pos)                       //双闪存模式
    |(0x1U<<QUADSPI_CR_SSHIFT_Pos)                    //延迟采样
    |(0x0U<<QUADSPI_CR_TCEN_Pos);                     //超时定时器是否使能

  QUADSPI->DCR=(23U<<QUADSPI_DCR_FSIZE_Pos)           //设置寻址大小 2^(x+1) 字节   25:64MB 20:2MB
    |((2U-1U)<<QUADSPI_DCR_CSHT_Pos)                  //设置cs最小高电平时间
    |(0U<<QUADSPI_DCR_CKMODE_Pos);                     //设置mode0 空闲低电平

  QUADSPI->CR|=QUADSPI_CR_EN;//使能qspi

}




/**
 * @brief 设置quadspi为内存映射模式
 * @return 无
 */
static void quadspi_SetMemoryMapped(){

  //设置交替字节
  QUADSPI->ABR=0xFFFFFFFF;

  //dataMode
  //0：无数据
  //1：单线传输数据
  //2：双线传输数据
  //3：四线传输数据

  //DummyCycles空闲时钟数

  //AlternateBytesSize
  //0：8 位交替字节
  //1：16 位交替字节
  //2：24 位交替字节
  //3：32 位交替字节

  //AlternateByteMode
  //0：无交替字节
  //1：单线传输交替字节
  //2：双线传输交替字节
  //3：四线传输交替字节

  //AddressSize
  //0：8 位地址
  //1：16 位地址
  //2：24 位地址
  //3：32 位地址

  //AddressMode
  //0：无地址
  //1：单线传输地址
  //2：双线传输地址
  //3：四线传输地址

  //cmdMode
  //0：无指令
  //1：单线传输指令
  //2：双线传输指令
  //3：四线传输指令

  QUADSPI->CCR=(0<<QUADSPI_CCR_DDRM_Pos)
    |(0<<QUADSPI_CCR_SIOO_Pos)
    |(QUADSPI_CCR_DMODE_Msk         &(0x02U <<QUADSPI_CCR_DMODE_Pos))         //dataMode
    |(QUADSPI_CCR_DCYC_Msk          &(0x00U <<QUADSPI_CCR_DCYC_Pos))          //DummyCycles
    |(QUADSPI_CCR_ABSIZE_Msk        &(0x00U <<QUADSPI_CCR_ABSIZE_Pos))        //AlternateBytesSize
    |(QUADSPI_CCR_ABMODE_Msk        &(0x02U <<QUADSPI_CCR_ABMODE_Pos))        //AlternateByteMode
    |(QUADSPI_CCR_ADSIZE_Msk        &(0x02U <<QUADSPI_CCR_ADSIZE_Pos))        //AddressSize
    |(QUADSPI_CCR_ADMODE_Msk        &(0x02U <<QUADSPI_CCR_ADMODE_Pos))        //AddressMode
    |(QUADSPI_CCR_IMODE_Msk         &(0x01U <<QUADSPI_CCR_IMODE_Pos))         //cmdMode
    |(QUADSPI_CCR_INSTRUCTION_Msk   &(0xBBU <<QUADSPI_CCR_INSTRUCTION_Pos))   //cmd
    |(QUADSPI_CCR_FMODE_Msk         &(0x03U <<QUADSPI_CCR_FMODE_Pos));        //内存映射模式 0:间接写入模式 1:间接读取模式 2:自动轮询模式 3:内存映射模式
                                                                      

}





